/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trunk.view.draw;

import java.awt.Color;
import java.awt.Graphics;

import java.util.List;
import trunk.model.Cercle;
import trunk.model.Dessin;
import trunk.model.ElementGeo;
import trunk.model.Groupe;
import trunk.model.PaintModel;
import trunk.model.Point;
import trunk.model.Polygone;
import trunk.model.Rectangle;
import trunk.model.Segment;
import trunk.observer.Observer;

/**
 * Class DrawZone 
 * 
 * Composant représentant la zone de dessin
 * 
 * @author LEFEVRE Michael
 * @author THOUE Jonathan
 */
public class DrawZone extends DrawZoneView implements Observer{
    
        
    private DrawCtrl ctrl;
    
    private PaintModel model;
    /**
     * Constructeur avec lien vers le MVC principal
     * @param model - lien vers le modele principal
     */
    public DrawZone(PaintModel model) {
      super();
       this.model=model; 
      setDrawCtrl( new DrawCtrl(this) );
    }
    /**
     * Get Model
     * @return le model principal
     */ 
    public PaintModel getModel() {
        return model;
    }
    /**
     * Set Model
     * @param model - le model principal
     */ 
    public void setModel(PaintModel model) {
        this.model = model;
    }
    /**
     * Méthode pour dessiner la vue
     * @param g - l'objet graphics
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        //draw grid
        int max =1000;
        int pas =model.getDessin().getPasGrid();
        
        for(int i=0;i<max;i=i+pas){
            g.setColor(Color.gray);
            g.drawLine(0, i, max, i);
            g.drawLine(i, 0, i, max);
        }
        //draw axe
        g.setColor(Color.red);
        g.drawLine(model.getDessin().getOrigine().getX(), 0, model.getDessin().getOrigine().getX(), max);
        g.drawLine(0, model.getDessin().getOrigine().getY(), max, model.getDessin().getOrigine().getY());

        dessiner(g,model.getDessin().getElements());
                
    }
    private void dessiner(Graphics g,List<ElementGeo> list){
        for (ElementGeo element : list){
            if(element instanceof Point){
                Point p = (Point)element;
                if(element.isSelected()){
                    g.setColor(Color.red);
                }else
                    g.setColor(element.getCouleur());
                
                g.fillRect(p.getX(), p.getY(), 4, 4);
            }else if(element instanceof Segment){
                Segment s = (Segment)element;
                if(element.isSelected()){
                    g.setColor(Color.red);
                }else
                    g.setColor(element.getCouleur());
                
                g.drawLine(s.getA().getX(), s.getA().getY(), s.getB().getX(), s.getB().getY());
            }else if(element instanceof Rectangle){
                Rectangle r = (Rectangle)element;
                if(element.isSelected()){
                    g.setColor(Color.red);
                }else
                    g.setColor(element.getCouleur());
                
                g.fillRect(r.getA().getX(), r.getA().getY(), r.getLargeur(), r.getHauteur());
            }else if(element instanceof Cercle){
                Cercle c = (Cercle)element;
                if(element.isSelected()){
                    g.setColor(Color.red);
                }else
                    g.setColor(element.getCouleur());
                
                g.fillOval(c.getA().getX()-c.getRayon(), c.getA().getY()-c.getRayon(), c.getRayon()*2, c.getRayon()*2);
            }else if(element instanceof Polygone){
                Polygone p = (Polygone)element;
                if(element.isSelected()){
                    g.setColor(Color.red);
                }else
                    g.setColor(element.getCouleur());
                
                int[] polygonX = new int[p.getListPoint().size()];
                int[] polygonY = new int[p.getListPoint().size()];
                 for (int i=0;i<p.getListPoint().size();i++){
                     polygonX[i]=p.getListPoint().get(i).getX();
                     polygonY[i]=p.getListPoint().get(i).getY();
                 }                
                g.fillPolygon(polygonX, polygonY, p.getListPoint().size());
            }else if(element instanceof Groupe){
                dessiner(g,((Groupe)element).getElements());
            }
        }
    }
    
    /**
     * Méthode de mise à jour de la vue
     * @param dessin - dessin courrant
     */
    @Override
    public void update(Dessin dessin) {
        this.validate();
        this.repaint();
    }

    
}
